home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / pctj1086.arc / EGATEST.MOD < prev    next >
Text File  |  1986-08-15  |  14KB  |  384 lines

  1. MODULE EGATest;
  2. (*
  3. Title   : EGATest.mod
  4.  
  5.     Enhanced Display Adapter Testing Program
  6.  
  7. LastEdit: July 22, 1986
  8. Author  : John T. Cockerham, M.D.
  9. System  : LOGITECH MODULA-2/86
  10. *)
  11. IMPORT Terminal;
  12. IMPORT InOut;
  13. FROM SYSTEM IMPORT ADDRESS, ADR;
  14. FROM LowEGA IMPORT
  15.   InitEGA, SetUpAlpha, SetUpHiRes, Write, WriteString,
  16.   SetActivePage, TurnOnBlinking, TurnOffBlinking, MonitorType,
  17.   HorScrollRight, HorizScroll, ResetHorizScroll, VerticalScrollDown,
  18.   ResetVerticalScroll, SetCursorPoint, SetCursor, SetBiosPalette,
  19.   WaitForVerticalRetrace, SplitScreenAt, RollSplitScreenUp,
  20.   RollSplitScreenDown, SetPalette, SetOverscan, BiosCRTParams,
  21.   MakeSecondGraphicsPage, DrawPoint, SetBiosCursorPoint,
  22.   RowsOnScreen, BytesPerChar, EGABiosRec, BiosCRTVars, ActivePage,
  23.   FillGraphicsPage, GetCursorPoint, LoadBiosFont, SetModeBios,
  24.   GetAlternatePrintScreen,PrintScreen, FontType, SetActiveFonts,
  25.   TotalVerticalScanLines, MaxVideoPages, EGABiosParams, EGASavePtr,
  26.   MemoryInstalled, MemoryInstalled256K, WaitForVerticalDisplay;
  27. FROM PointLib IMPORT Point, MakePoint, BumpPointY;
  28. FROM FontBumper IMPORT SetUpFontBumping, ResetFontBumping;
  29. FROM Conversions IMPORT ConvertCardinal;
  30. FROM Strings IMPORT Insert;
  31. FROM Pauses IMPORT Pause, GraphicsPause;
  32. FROM DrawPoly IMPORT DrawLine, DrawBox;
  33. FROM DotTime IMPORT DotTimingTest;
  34.  
  35. CONST Blank = 020H;   (* An ASCII Blank    *)
  36.       VIDEO = 010H;   (* Bios video int    *)
  37.       HiRes = 010H;   (* Color Hi Res Mode *)
  38.       Alpha = 003H;   (* Color Alpha Mode  *)
  39.       Page0 = 0;  Page1 = 1;
  40.       WaitingTime = 500;
  41.  
  42.  
  43.   PROCEDURE SayHello;
  44.   BEGIN
  45.     SetModeBios(Alpha); SetUpAlpha;
  46.     SetActivePage(Page1);
  47.     Pause('PC TECH JOURNAL EGA Testing Program');
  48.     Pause('by John T. Cockerham');
  49.     Pause('Portions copyright (c) Logitech Corporation, 1986');
  50.     Pause('Copyright (c) PC Tech Journal, 1986');
  51.     Pause('Aborting this program during Font Bumping...');
  52.     Pause('Will leave the EGA in an undefined state.');
  53.   END SayHello;
  54.  
  55.   PROCEDURE CheckMemorySize() : BOOLEAN;
  56.   BEGIN
  57.     RETURN (MemoryInstalled = MemoryInstalled256K);
  58.   END CheckMemorySize;
  59.  
  60.   PROCEDURE WaitAWhile;
  61.     VAR i : CARDINAL;
  62.   BEGIN
  63.     FOR i := 0 TO WaitingTime DO
  64.       WaitForVerticalRetrace;
  65.       WaitForVerticalDisplay;
  66.     END;
  67.   END WaitAWhile;
  68.  
  69.     (* This routine makes a split screen in alpha mode *)
  70.   PROCEDURE MakeSplitScreen(NumberOfRows,NewPage,NewLine : CARDINAL);
  71.     VAR
  72.       Cursor : Point; Lines : CARDINAL;
  73.   BEGIN
  74.     Lines := NumberOfRows * BytesPerChar;
  75.     SetActivePage(NewPage);    MakePoint(Cursor, 0, NewLine);
  76.     SetCursorPoint(ActivePage, Cursor);
  77.     RollSplitScreenUp(Lines);
  78.   END MakeSplitScreen;
  79.  
  80.   PROCEDURE SplitAndScroll2Ways;
  81.     VAR i : CARDINAL;
  82.   BEGIN
  83.     Pause('Splitting and Scrolling 3 ways at a time');
  84.     FOR i := 0 TO 300 DO
  85.              (* Here scroll horizontally by one *)
  86.       HorScrollRight;
  87.              (* Here bring up one line on the split screen *)
  88.       SplitScreenAt(TotalVerticalScanLines - i);
  89.              (* Here scroll vertically by one line *)
  90.       VerticalScrollDown;
  91.     END;
  92.     WaitAWhile;
  93.   END SplitAndScroll2Ways;
  94.  
  95.   PROCEDURE FillPage(PageNumber : CARDINAL);
  96.     VAR
  97.         j : INTEGER; CursorStart : Point;
  98.   BEGIN
  99.     SetActivePage(PageNumber);   MakePoint(CursorStart, 0, 0);
  100.     SetCursorPoint(PageNumber, CursorStart);
  101.     FOR j := 0 TO (ORD(RowsOnScreen) + 1) * BiosCRTParams.CRTCols - 1
  102.       DO Write (PageNumber, CHR(ORD('0') + PageNumber), 3);
  103.     END;
  104.   END FillPage;
  105.  
  106.   PROCEDURE FillAndSplitTest;
  107.     PROCEDURE SoftScrollTest(Page, Lines  : CARDINAL);
  108.       VAR l : CARDINAL;   p : Point;
  109.     BEGIN
  110.       SetActivePage(Page);
  111.       MakePoint(p, 10, 10); SetCursorPoint(ActivePage, p);
  112.       Pause('Vertical scrolling test');
  113.       l := 0;
  114.       WHILE l < Lines DO VerticalScrollDown; INC(l);  END;
  115.       ResetVerticalScroll;
  116.       Pause('End vertical scrolling test');
  117.     END SoftScrollTest;
  118.  
  119.     PROCEDURE SplitCursorTest;
  120.       VAR p : Point;
  121.     BEGIN
  122.       Pause('Split cursor test');    SetActivePage(ActivePage);
  123.       ResetHorizScroll;              MakePoint (p, 0, 3);
  124.       SetCursorPoint(ActivePage, p); HorizScroll(4);
  125.       WaitAWhile;
  126.       ResetHorizScroll;
  127.       Pause('End split cursor test');
  128.     END SplitCursorTest;
  129.  
  130.     PROCEDURE WriteCP(line : CARDINAL);
  131.       VAR s : ARRAY [0..15] OF CHAR;
  132.           p : Point; i, color : CARDINAL;
  133.     BEGIN
  134.       FOR i := 0 TO HIGH(s) DO s[i] := CHR(Blank); END;
  135.       MakePoint(p, 0, line);          color := line + 2;
  136.       SetCursorPoint(ActivePage, p);
  137.       WriteString(ActivePage, ' Line ', color);
  138.       ConvertCardinal(line, 3, s);
  139.       WriteString(ActivePage, s, color);
  140.     END WriteCP;
  141.  
  142.     (* Variables for the main routine  *)
  143.     VAR   i : INTEGER;     p : Point;
  144.     BEGIN
  145.       SetActivePage(Page1);
  146.       Pause('Filling and Splitting Test');
  147.           (* Here fill all of the video pages with something *)
  148.       FOR i := 0 TO MaxVideoPages DO  FillPage(i);  END;
  149.           (* Test the soft scrolling in several ways *)
  150.       SoftScrollTest(4, 180);
  151.       Pause('Horizontal Pixel Pan to Left');
  152.       HorizScroll(280); Pause('Pixel pan to right');
  153.       HorizScroll(-280);
  154.           (* Fill up Page 0 with some other information *)
  155.       SetActivePage(Page0);    FOR i := 0 TO 15 DO WriteCP(i); END;
  156.           (* Turn on the overscan to green *)
  157.       Pause('Turning on green border'); SetOverscan(2);
  158.           (* Scroll up the split screen with 4 lines of text *)
  159.       Pause('Bringing up Split Screen with 4 lines of text');
  160.       MakeSplitScreen(4, 3, 14); WaitAWhile;
  161.       Pause('Split Screen Test Complete');
  162.           (* Now torture the board doing everything at once *)
  163.       IF SetUpFontBumping(4) THEN
  164.         Pause('Font Bumping enabled at 4.5 times per second');
  165.       ELSE
  166.         Pause('Unable to set up Font Bumping');
  167.       END;
  168.       SplitAndScroll2Ways;
  169.           (* See what happens when the cursor split across 2 rows *)
  170.       SplitCursorTest;      Pause('End of Fill and Split Test');
  171.       ResetFontBumping;     Pause('Font bumping disabled');
  172.     END FillAndSplitTest;
  173.  
  174.   PROCEDURE CycleTheFontsTest;
  175.     VAR i : CARDINAL; s, t : ARRAY [0..14] OF CHAR;
  176.  
  177.     PROCEDURE DisplayEntireFont;
  178.       VAR p: Point;
  179.     BEGIN
  180.       SetActivePage(Page1);
  181.       MakePoint(p, 0, 0);
  182.       SetCursorPoint(ActivePage, p);
  183.       FOR i := 0 TO 255 DO Write(Page1, CHR(i), 5); END;
  184.     END DisplayEntireFont;
  185.  
  186.   BEGIN
  187.     SetActiveFonts(0, 0);
  188.     DisplayEntireFont;
  189.     Insert('This is Font ', s, 0);
  190.     Pause('Cycling through the Active Fonts');
  191.     FOR i := 0 TO 3 DO
  192.       SetActiveFonts(i, i);     ConvertCardinal(i, 2, t);
  193.       Insert(t, s, 13);         Pause(s);
  194.     END;
  195.   END CycleTheFontsTest;
  196.  
  197.  
  198.   PROCEDURE Mode3GraphicsTest;
  199.     (* This routine tests the line graphics characters on the CRT*)
  200.     CONST
  201.           LLBoxCorner1 = 192;            URBoxCorner1 = 191;
  202.           LRBoxCorner1 = 217;            ULBoxCorner1 = 218;
  203.           VertLine1    = 179;            HorizLine1   = 196;
  204.           LLBoxCorner2 = 200;            URBoxCorner2 = 187;
  205.           LRBoxCorner2 = 188;            ULBoxCorner2 = 201;
  206.             VertLine2    = 186;            HorizLine2   = 205;
  207.     VAR   i : CARDINAL;
  208.  
  209.     PROCEDURE WriteCharAt(ch : CHAR; Row, Column, Color : CARDINAL);
  210.        VAR p: Point;
  211.     BEGIN
  212.       MakePoint(p, Column, Row); SetCursorPoint(ActivePage, p);
  213.       Write(ActivePage, ch, Color);
  214.     END WriteCharAt;
  215.  
  216.   BEGIN
  217.     Pause('Text 80 Graphics Test');
  218.     SetActivePage(0);
  219.     WriteCharAt(CHR(ULBoxCorner1), 0,  0, 3);
  220.     FOR i := 1 TO 78 DO Write(ActivePage, CHR(HorizLine1), 3) END;
  221.     WriteCharAt(CHR(URBoxCorner1), 0, 79, 3);
  222.     WriteCharAt(CHR(LLBoxCorner1), 24, 0, 3);
  223.     FOR i := 1 TO 78 DO Write(ActivePage, CHR(HorizLine1), 3) END;
  224.     WriteCharAt(CHR(LRBoxCorner1), 24, 79, 3);
  225.     FOR i := 1 TO 23 DO
  226.       WriteCharAt(CHR(VertLine1), i,  0, 3);
  227.       WriteCharAt(CHR(VertLine1), i, 79, 3);
  228.     END;
  229.     WriteCharAt(CHR(ULBoxCorner2), 2,  2, 3);
  230.     FOR i := 3 TO 76 DO Write(ActivePage, CHR(HorizLine2), 3) END;
  231.     WriteCharAt(CHR(URBoxCorner2), 2, 77, 3);
  232.     WriteCharAt(CHR(LLBoxCorner2), 22, 2, 3);
  233.     FOR i := 3 TO 76 DO Write(ActivePage, CHR(HorizLine2), 3) END;
  234.     WriteCharAt(CHR(LRBoxCorner2), 22, 77, 3);
  235.     FOR i := 3 TO 21 DO
  236.       WriteCharAt(CHR(VertLine2), i,  2, 3);
  237.       WriteCharAt(CHR(VertLine2), i, 77, 3);
  238.     END;
  239.     WriteCharAt(CHR(206), 17, 14, 3);
  240.     Pause('End Monochrome character Graphics Test');
  241.   END Mode3GraphicsTest;
  242.  
  243.   PROCEDURE Mode10GraphicsTest;
  244.     VAR
  245.         p1, p2 : Point;
  246.   BEGIN
  247.     Pause('Raster Graphics Test Starting');
  248.     DotTimingTest;
  249.     SetModeBios(Alpha); SetUpAlpha; Pause('Line and Fill Test ');
  250.     SetModeBios(HiRes); SetUpHiRes; SetActivePage(0);
  251.     MakePoint(p1, 0, 0);       MakePoint(p2, 639, 349);
  252.     DrawBox(p1, p2, 14);       MakePoint(p1, 1, 1);
  253.     MakePoint(p2, 638, 348);   DrawBox(p1, p2, 5);
  254.     MakePoint(p1, 5, 5);       MakePoint(p2, 600, 300);
  255.     DrawBox(p1, p2, 6);
  256.     GraphicsPause(Page0, 'Yellow Box Drawn at edge of screen');
  257.     TurnOnBlinking;
  258.     GraphicsPause(Page0, 'Blinking Test ongoing             ');
  259.     TurnOffBlinking;
  260.     GraphicsPause(Page0, 'Recoloring Palettes 0 and 8       ');
  261.     SetPalette(8, 0);          SetPalette(2, 18);
  262.     SetPalette(10, 36);        TurnOnBlinking;
  263.     GraphicsPause(Page0, 'Second Blink Test.                ');
  264.     TurnOffBlinking;           MakeSecondGraphicsPage;
  265.     FillGraphicsPage(10);      RollSplitScreenUp(110);
  266.     GraphicsPause(Page1, 'Double Yellow Line on Split Screen');
  267.     GraphicsPause(Page1, 'Turning Blinking On Again         ');
  268.     TurnOnBlinking;       FillGraphicsPage(8);
  269.     GraphicsPause(Page1, 'Ending Mode 10 Graphics Test      ');
  270.     TurnOffBlinking;           RollSplitScreenDown;
  271.   END Mode10GraphicsTest;
  272.  
  273.   PROCEDURE FillPageTerm(s : ARRAY OF CHAR);
  274.     VAR i, NumberOfTimes : CARDINAL;
  275.   BEGIN
  276.     NumberOfTimes := 43 * 80 DIV HIGH(s);
  277.     FOR i := 1 TO NumberOfTimes DO
  278.        Terminal.WriteString(s);  END;
  279.   END FillPageTerm;
  280.  
  281.   PROCEDURE Check43x80Mode;
  282.   BEGIN
  283.     SetModeBios(03H);
  284.     LoadBiosFont(DoubleDotFont, TRUE, 0);
  285.     GetAlternatePrintScreen;
  286.     FillPageTerm(' PC Tech Journal EGA Test ');
  287.     PrintScreen;
  288.     SetUpAlpha; Pause('End 43 by 80 test');
  289.   END Check43x80Mode;
  290.  
  291.   VAR NewSaveArea : RECORD
  292.           VideoParamsPointer : ADDRESS;
  293.           DynamicSavePointer : ADDRESS;
  294.           AlphaAuxilaryPtr   : ADDRESS;
  295.           GraphicsAuxilaryPtr: ADDRESS;
  296.           Reserved5          : ADDRESS;
  297.           Reserved6          : ADDRESS;
  298.           Reserved7          : ADDRESS;
  299.           Reserved8          : ADDRESS;
  300.         END;
  301.       DynamicSaveArea : ARRAY [0..256] OF CHAR;
  302.       OldSaveAreaPtr  : ADDRESS;
  303.  
  304.   (* This routine checks out the save area functions of the BIOS
  305.      It firsts saves the old pointer, then it points to a new
  306.      table. A mode set is called, and one palette is changed. The
  307.      save area is then checked to make sure the change was passed
  308.      back to the save area.  *)
  309.   PROCEDURE SaveAreaTest;
  310.     PROCEDURE DumpSaveArea;
  311.  
  312.       PROCEDURE WritePal(index : CARDINAL; Pal : CHAR);
  313.       BEGIN
  314.           InOut.WriteString('Palette '); InOut.WriteCard(index, 3);
  315.           InOut.WriteString('. ');       InOut.WriteHex(ORD(Pal), 2);
  316.       END WritePal;
  317.  
  318.       VAR i : CARDINAL;
  319.     BEGIN
  320.       FOR i := 1 TO 3 DO InOut.WriteLn; END;
  321.       FOR i:= 0 TO 15 BY 2 DO
  322.         WritePal(i, DynamicSaveArea[i]);
  323.         InOut.WriteString('     ');
  324.         WritePal(i+1, DynamicSaveArea[i+1]);
  325.         InOut.WriteLn;
  326.       END;
  327.       InOut.WriteString('Overscan  ');
  328.       InOut.WriteHex(ORD(DynamicSaveArea[16]),2);
  329.       InOut.WriteLn;
  330.     END DumpSaveArea;
  331.  
  332.   BEGIN
  333.     SetModeBios(Alpha);  SetUpAlpha;  SetActivePage(Page1);
  334.     Pause('Save Area Test');    SetModeBios(Alpha);
  335.     OldSaveAreaPtr := EGASavePtr;
  336.     NewSaveArea.VideoParamsPointer := EGASavePtr^;
  337.     WITH NewSaveArea DO
  338.       DynamicSavePointer := ADR(DynamicSaveArea);
  339.       AlphaAuxilaryPtr   := 0H:0H;
  340.       GraphicsAuxilaryPtr:= 0H:0H;
  341.       Reserved5          := 0H:0H;
  342.       Reserved6          := 0H:0H;
  343.       Reserved7          := 0H:0H;
  344.       Reserved8          := 0H:0H;
  345.     END;
  346.          (* Now set up the new pointer *)
  347.     EGASavePtr := ADR(NewSaveArea.VideoParamsPointer);
  348.          (* Issue a mode change call through the Bios *)
  349.          (* Now dump the palette stuff out on the console *)
  350.     SetModeBios(Alpha);
  351.     DumpSaveArea;
  352.          (* Change Palette 5 to something different *)
  353.     SetBiosPalette(5, 031H);
  354.     Terminal.WriteString('New Palette Value at 5');
  355.     Terminal.WriteLn;
  356.     DumpSaveArea;
  357.     EGASavePtr := OldSaveAreaPtr; SetUpAlpha;
  358.     Pause('Ending Save Area Test');
  359.     SetModeBios(Alpha);    SetUpAlpha;
  360.   END SaveAreaTest;
  361.  
  362. BEGIN
  363.    IF InitEGA(Color) AND CheckMemorySize() THEN
  364.      SayHello;
  365.      FillAndSplitTest;
  366.      CycleTheFontsTest;
  367.      Mode3GraphicsTest;
  368.      Mode10GraphicsTest;
  369.      SaveAreaTest;
  370.      Check43x80Mode;
  371.      Pause('Finished');
  372.      SetModeBios(Alpha);
  373.    ELSE
  374.      SetModeBios(Alpha);
  375.      IF NOT CheckMemorySize() THEN
  376.        InOut.WriteString('Insufficient Graphics Ram for Test.');
  377.      ELSE
  378.        InOut.WriteString('Unknown Error During Initialization.');
  379.      END;
  380.      InOut.WriteLn;
  381.    END;
  382. END EGATest.
  383.  
  384.